<?php
/**
 * setメソッドのテスト
 * 
 * @since 2012/03/04
 */
class TestofYuToriSet extends UnitTestCase {
	public function __construct () {
	}

	// 試験汎用
	// 第1引数のみ指定
	private function _CommonTest_01 ($value, $type) {
		$y = YuTori::factory('orig', 'originalName');
		
		$this->assertTrue($y->set ($value) == $y, '戻り値判定');
		$this->assertIdentical($res = $y->getType() , $type, '型判定');
		$this->assertIdentical($res = $y->getName() , 'originalName', '名称判定');
		$this->assertIdentical($res = $y->get() , $value, 'get値判定');
		$this->assertIdentical($res = $y->call() , $value, 'call値判定');
	}
	private function _CommonTestY_01 ($value, $type, $instance) {
		$y = YuTori::factory('orig', 'originalName');
		
		$this->assertTrue ($y->set ($value) == $y, '戻り値判定');
		$this->assertIdentical($res = $y->getType() , $type, '型判定');
		$this->assertIdentical($res = $y->getName() , 'originalName', '名称判定');
		$this->assertIdentical($res = $y->get() , $instance, 'get値判定');
		$this->assertIdentical($res = $y->call() , $instance, 'call値判定');
	}

	// TYPE_SCALAR
	public function TestofScalar() {
		$this->_CommonTest_01 ('Test', YuTori::TYPE_SCALAR);
		$this->_CommonTest_01 (1, YuTori::TYPE_SCALAR);
	}

	// TYPE_BOOL
	// booleanは２つしかないのでどっちも試験する。
	public function TestofBool() {
		$this->_CommonTest_01 (true, YuTori::TYPE_BOOL);
		$this->_CommonTest_01 (false, YuTori::TYPE_BOOL);
	}

	// TYPE_NULL
	public function TestofNull() {
		$this->_CommonTest_01 (null, YuTori::TYPE_NULL);
	}

	// TYPE_ARRAY
	public function TestofArray() {
		$arr = array(0,1,2);
		$this->_CommonTest_01 ($arr, YuTori::TYPE_ARRAY);
	}
	// TYPE_OBJECT
	public function TestofObject() {
		$obj = new stdClass();
		$this->_CommonTest_01 ($obj, YuTori::TYPE_OBJECT);
	}

	// TYPE_CALLABLE
	public function TestofCallable() {
		$y = YuTori::factory('orig', 'originalName');

		$y->set('myFunc', YuTori::TYPE_CALLABLE);
		$this->assertIdentical($y->getType() , YuTori::TYPE_CALLABLE, '型判定');
		$this->assertIdentical($y->getName() , 'originalName', '名称判定');
		$this->assertIdentical($y->get() , 'myFunc', 'get値判定');
		$this->assertIdentical($y->call() , 'Func!', 'call値判定');

		// メソッドの時
		$y = YuTori::factory('orig', 'originalName');

		$func = array(new myClass(), 'func');
		$y->set($func, YuTori::TYPE_CALLABLE);
		$this->assertIdentical($y->getType() , YuTori::TYPE_CALLABLE, '型判定');
		$this->assertIdentical($y->getName() , 'originalName', '名称判定');
		$this->assertTrue($y->get() == $func , 'get値判定');
		$this->assertIdentical($y->call() , 'Method!', 'call値判定');

		// 存在しない関数
		$y = YuTori::factory('orig', 'originalName');
		$y->set('myFunc2', YuTori::TYPE_CALLABLE);
		$this->assertIdentical($y->getType() , YuTori::TYPE_SCALAR, '型判定');
		$this->assertIdentical($y->getName() , 'originalName', '名称判定');
		$this->assertIdentical($y->get() , 'orig', 'get値判定');
		$this->assertIdentical($y->call() , 'orig', 'call値判定');
		$this->assertFalse($y->isEmpty(), 'isEmpty値判定');

		// 存在しないメソッド
		$y = YuTori::factory('orig', 'originalName');
		$func = array(new myClass(), 'func2');
		$y->set($func, YuTori::TYPE_CALLABLE);
		$this->assertIdentical($y->getType() , YuTori::TYPE_SCALAR, '型判定');
		$this->assertIdentical($y->getName() , 'originalName', '名称判定');
		$this->assertIdentical($y->get() , 'orig', 'get値判定');
		$this->assertIdentical($y->call() , 'orig', 'call値判定');
		$this->assertFalse($y->isEmpty(), 'isEmpty値判定');
	}

	// TYPE_FILE 

	// TYPE_YuToriObject
	public function TestofY_Scalar() {
		$y = YuTori::factory('test');
		$this->_CommonTestY_01 ($y, YuTori::TYPE_SCALAR, 'test');
	}
	public function TestofY_Bool() {
		$y = YuTori::factory(true);
		$this->_CommonTestY_01 ($y, YuTori::TYPE_BOOL, true);
	}
	public function TestofY_Null() {
		$y = YuTori::factory(null);
		$this->_CommonTestY_01 ($y, YuTori::TYPE_NULL, null);
	}
	public function TestofY_Array() {
		$y = YuTori::factory(array(0,1,2));
		$this->_CommonTestY_01 ($y, YuTori::TYPE_ARRAY, array(0,1,2));
	}
	public function TestofY_Object() {
		$y = YuTori::factory(new stdClass());
		$this->_CommonTestY_01 ($y, YuTori::TYPE_OBJECT, new stdClass());
	}
	
	// その他の試験
	public function TestofNoUseName () {
	}
}

if (!function_exists('myFunc')) {
	function myFunc () {
		return 'Func!';
	}
}

if (!class_exists('myClass')) {
	class myClass {
		function func () {
			return 'Method!';
		}
	}
}